package com.flyxteam.commons.dao.mybatis.api;

import java.util.List;
import java.util.Map;

import com.flyxteam.commons.dao.mybatis.api.condition.Condition;
import com.github.miemiedev.mybatis.paginator.domain.PageBounds;

/**
 * 对外接口，提供了增删改查功能
 * @author yuzh
 *
 */
public interface MybatisDao {

	/**
	 * 单条插入
	 * @param o 数据对象
	 * @return
	 */
	int insert(Object o);

	/**
	 * 单条插入
	 * @param tableName 表名
	 * @param columns 待存入数据
	 * @return
	 */
	int insert(String tableName, Map<String, Object> columns);
	
	/**
	 * 批量插入
	 * 批量保存数据不设置返回值是因为，BATCH模式下，跟新返回值会丢失
	 * 官方提示如下：If the BATCH executor is in use, the update counts are being lost.
	 * @param l 待存入数据集合
	 */
	void insertBatch(List<? extends Object> l);
	
	/**
	 * 批量插入
	 * 批量保存数据不设置返回值是因为，BATCH模式下，跟新返回值会丢失
	 * 官方提示如下：If the BATCH executor is in use, the update counts are being lost.
	 * @param tableName 表名
	 * @param l 待存入数据集合
	 */
	void insertBatch(String tableName, List<Map<String, Object>> l);
	
	/**
	 * 通过主键修改，表名通过T的@Table获取，主键字段信息通过T的@PK获取
	 * @param t 待修改数据对象
	 * @return
	 */
	int updateByPk(Object o);
	
	/**
	 * 通过主键修改
	 * @param tableName 表名
	 * @param pkColumnName 主键字段名
	 * @param pkColumnValue 主键字段值
	 * @param updateColumnMap 待修改数据
	 * @return
	 */
	int updateByPk(String tableName, String pkColumnName, Object pkColumnValue, Map<String, Object> updateColumnMap);
	
	/**
	 * 通过条件修改，表名通过T的@Table获取
	 * @param o 待修改数据对象
	 * @param conditionList 条件集合
	 * @return
	 */
//	int updateByCondition(Object o, List<ConditionBean> conditionList);
	
	/**
	 * 通过条件修改
	 * @param tableName 表名
	 * @param updateColumnMap 待修改数据
	 * @param conditionList 条件集合
	 * @return
	 */
//	int updateByCondition(String tableName, Map<String, Object> updateColumnMap, List<ConditionBean> conditionList);
	
	/**
	 * 通过条件修改，表名通过T的@Table获取
	 * @param o 待修改数据对象
	 * @param conditionList 条件集合，4个元素为一组，举例：[and, column1, "=", value1, or, column2, "=", value2]
	 * @return
	 */
//	int updateByCondition(Object o, Object...conditionList);
	
	/**
	 * 通过条件修改
	 * @param tableName 表名
	 * @param updateColumnMap 待修改数据
	 * @param conditionList 条件集合，4个元素为一组，举例：[and, column1, "=", value1, or, column2, "=", value2]
	 * @return
	 */
//	int updateByCondition(String tableName, Map<String, Object> updateColumnMap, Object...conditionList);
	
	/**
	 * 通过主键删除
	 * @param tableName 表名
	 * @param pkColumnName 主键字段名
	 * @param pkColumnValue 主键字段值
	 * @return
	 */
	int deleteByPk(String tableName, String pkColumnName, Object pkColumnValue);
	
	/**
	 * 通过pk删除
	 * @param c 待删除数据映射类
	 * @param pkColumnValue 主键字段值
	 * @return
	 */
	int deleteByPk(Class<? extends Object> c, Object pkColumnValue);
	
	/**
	 * 通过条件删除
	 * @param tableName 表名
	 * @param conditionList 条件集合
	 * @return
	 */
//	int deleteByCondition(String tableName, List<ConditionBean> conditionList);
	
	/**
	 * 通过条件删除，表名通过c的@Table获取
	 * @param c 待删除数据映射类
	 * @param conditionList 条件集合
	 * @return
	 */
//	<T> int deleteByCondition(Class<T> c, List<ConditionBean> conditionList);
	
	/**
	 * 通过条件删除，表名通过condition的@Table获取，condition中的条件符号全部使用=
	 * @param condition 条件实体
	 * @return
	 */
//	int deleteByCondition(Object condition);
	
	/**
	 * 通过条件删除
	 * @param tableName 表名
	 * @param conditionList 条件集合，4个元素为一组，举例：[and, column1, "=", value1, or, column2, "=", value2]
	 * @return
	 */
//	int deleteByCondition(String tableName, Object...conditionList);
	
	/**
	 * 通过条件删除
	 * @param c 待删除数据映射类
	 * @param conditionList 条件集合，4个元素为一组，举例：[and, column1, "=", value1, or, column2, "=", value2]
	 * @return
	 */
//	<T> int deleteByCondition(Class<T> c, Object...conditionList);
	
	/**
	 * 通过主键获取单条记录，表名通过c的@Table获取，主键字段名通过c的@PK获取
	 * @param c 数据映射类
	 * @param pkColumnValue 主键字段值
	 * @return
	 */
	<T> T selectByPk(Class<T> c, Object pkColumnValue);
	
	/**
	 * 通过主键获取单条记录
	 * @param tableName 表名
	 * @param pkColumnName 主键字段名
	 * @param pkColumnValue 主键字段值
	 * @return
	 */
	<T> T selectByPk(String tableName, String pkColumnName, Object pkColumnValue);
	
	/**
	 * 通过条件获取结果集
	 * @param tableName 表名
	 * @param conditionList 条件集合
	 * @return
	 */
	List<Map<String, Object>> select(String tableName, List<Condition> conditionList);
	
	/**
	 * 通过条件获取结果集，表名通过c的@Table获取
	 * @param c 数据映射类
	 * @param conditionList 查询条件
	 * @return
	 */
	<T> List<T> select(Class<T> c, List<Condition> conditionList);
	
	/**
	 * 通过条件获取结果集，表名通过t的@Table获取，condition中的条件符号全部使用=
	 * @param t 查询条件对象
	 * @return
	 */
	<T> List<T> select(T condition);
	
	/**
	 * 通过条件获取结果集，condition中的条件符号全部使用=
	 * @param tableName 表名
	 * @param conditionList 条件集合，4个元素为一组，举例：[and, column1, "=", value1, or, column2, "=", value2]
	 * @return
	 */
//	List<Map<String, Object> select(String tableName, Object...conditionList);
	
	/**
	 * 通过条件获取结果集，表名通过c的@Table获取，condition中的条件符号全部使用=
	 * @param c 数据映射类
	 * @param conditionList 条件集合，4个元素为一组，举例：[and, column1, "=", value1, or, column2, "=", value2]
	 * @return
	 */
//	<T> List<T> select(Class<T> c, Object...conditionList);
	
	/**
	 * 查询全部数据列表，表名通过c的@Table获取
	 * @param c 数据映射类
	 * @return
	 */
	<T> List<T> select(Class<T> c);
	
	/**
	 * 查询全部数据列表
	 * @param tableName
	 * @return
	 */
	List<Map<String, Object>> select(String tableName);

	/**
	 * 分页查询
	 * @param tableName
	 * @param conditionList
	 * @param pageBounds
	 * @return
	 */
	List<Map<String, Object>> selectPage(String tableName, List<Condition> conditionList, PageBounds pageBounds);

	/**
	 * 分页查询
	 * @param tableName
	 * @param conditionList
	 * @param page
	 * @param limit
	 * @return
	 */
	List<Map<String, Object>> selectPage(String tableName, List<Condition> conditionList, int page, int limit);

	/**
	 * 分页查询
	 * @param tableName
	 * @param conditionList
	 * @param page
	 * @param limit
	 * @param orderExp column1 AES, column2 DESC
	 * @return
	 */
	List<Map<String, Object>> selectPage(String tableName, List<Condition> conditionList, int page, int limit,
			String orderExp);

	/**
	 * 分页查询
	 * @param c
	 * @param conditionList
	 * @param pageBounds
	 * @return
	 */
	<T> List<T> selectPage(Class<T> c, List<Condition> conditionList, PageBounds pageBounds);

	/**
	 * 分页查询
	 * @param c
	 * @param conditionList
	 * @param page
	 * @param limit
	 * @return
	 */
	<T> List<T> selectPage(Class<T> c, List<Condition> conditionList, int page, int limit);

	/**
	 * 分页查询
	 * @param c
	 * @param conditionList
	 * @param page
	 * @param limit
	 * @param orderExp column1 AES, column2 DESC
	 * @return
	 */
	<T> List<T> selectPage(Class<T> c, List<Condition> conditionList, int page, int limit, String orderExp);

	/**
	 * 分页查询
	 * @param condition
	 * @param pageBounds
	 * @return
	 */
	<T> List<T> selectPage(T condition, PageBounds pageBounds);

	/**
	 * 分页查询
	 * @param condition
	 * @param page
	 * @param limit
	 * @return
	 */
	<T> List<T> selectPage(T condition, int page, int limit);

	/**
	 * 分页查询
	 * @param condition
	 * @param page
	 * @param limit
	 * @param orderExp column1 AES, column2 DESC
	 * @return
	 */
	<T> List<T> selectPage(T condition, int page, int limit, String orderExp);

	/**
	 * 分页查询
	 * @param c
	 * @param pageBounds
	 * @return
	 */
	<T> List<T> selectPage(Class<T> c, PageBounds pageBounds);

	/**
	 * 分页查询
	 * @param c
	 * @param page
	 * @param limit
	 * @return
	 */
	<T> List<T> selectPage(Class<T> c, int page, int limit);

	/**
	 * 分页查询
	 * @param c
	 * @param page
	 * @param limit
	 * @param orderExp column1 AES, column2 DESC
	 * @return
	 */
	<T> List<T> selectPage(Class<T> c, int page, int limit, String orderExp);

	/**
	 * 分页查询
	 * @param tableName
	 * @param pageBounds
	 * @return
	 */
	List<Map<String, Object>> selectPage(String tableName, PageBounds pageBounds);

	/**
	 * 分页查询
	 * @param tableName
	 * @param page
	 * @param limit
	 * @return
	 */
	List<Map<String, Object>> selectPage(String tableName, int page, int limit);

	/**
	 * 分页查询
	 * @param tableName
	 * @param page
	 * @param limit
	 * @param orderExp column1 AES, column2 DESC
	 * @return
	 */
	List<Map<String, Object>> selectPage(String tableName, int page, int limit, String orderExp);

}
